package com.javaex.book.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.javaex.book.web.HandlerMapping;

/**
 * 读取.class文件，获取Class实例
 *
 * @author 黄星琦
 * @Date 2022年3月2日
 */
public class ClassFileUtils {
	
	private static final Logger logger = LoggerFactory.getLogger(ClassFileUtils.class);

	/**
	 * 获取存放类的全限定包名
	 * 
	 * <p>默认放在与当前类所在包同级的包下
	 * 
	 * @return 存放类的全限定包名
	 */
	public static String getQualifiedPackageName(String packageName) {
		String currentPackageName = ClassFileUtils.class.getPackageName();
		return currentPackageName.substring(0, currentPackageName.lastIndexOf(".") + 1) + packageName;
	}
		
	/**
	 * 读取指定文件夹内所有的文件，获取文件对应的的Class对象
	 * 
	 * @param packageName 包名
	 * @return 包含Class对象的集合
	 */
	public static List<Class<?>> getClassList(String packageName) {
		String qualifiedPackageName = getQualifiedPackageName(packageName);
		List<Class<?>> classList = new ArrayList<Class<?>>();
		StringBuffer folder = new StringBuffer();
		// 拼接项目路径
		folder.append(HandlerMapping.class.getClassLoader().getResource("").getPath());
		// 拼接项目目录下文件夹路径
		folder.append(qualifiedPackageName.replace(".", "/"));
		// 获取文件夹下的所有文件
		File[] controllerFiles = new File(folder.toString()).listFiles();
		for (File file : controllerFiles) {
			// 拼接获取的全限定名类名
			String className = qualifiedPackageName + "." + file.getName().replace(".class", "");
			try {
				Class<?> clazz = Class.forName(className);
				classList.add(clazz);
			} catch (ClassNotFoundException e) {
				logger.error("读取文件夹，获取Class对象失败{}", LoggerUtils.format(e, "com.javaex.book"));
			}
		}
		return classList;
	}
}
